<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>

    <script>

        // 作用域 : 变量生效的范围
        //   局部变量：在函数里面声明的变量    只能在函数内部使用
        //   全局变量：在函数外面声明的变量    在函数内外都生效



        // var a = 1;

        // function fn() {
        //     // b属于函数内部声明的变量，次变量只能在函数内使用
        //     var b = 3;
        //     // a是函数外面声明的变量，在函数里面和外面都可以使用
        //     console.log(a);
        // }

        // fn();


        // console.log(a);
        // console.log(b);    // 报错   b is not defined

        // console.log('开始');

        // // 声明了函数 ， 函数没有调用的时候，里面的代码是不会执行的
        // function fn() {
        //     console.log(a);
        // }

        // var a = 1;
        // // 调用函数的时候，函数里面的代码执行
        // fn();





        // function fn() {
        //     // b是函数fn里面声明的局部变量
        //     var b = 3;

        //     // f这个函数可以访问到他的父函数的局部变量   ---- 对于子函数而言，父函数中的变量就是它的全局变量
        //     function f() {
        //         console.log(b);
        //     }
        //     f();
        // }
        // fn();

        // console.log(b);   // 报错


        // 一般情况下，一个函数无法访问另一个函数的局部变量
        // 除非，这两个函数是嵌套关系   



        // 作用域链
        //    函数在访问变量的时候,优先访问自己的，
        //    自己要是没有，就去访问父函数的。。。。
        //    如果父函数没有，就去访问全局变量的
        //    全局变量没有，就报错

        var b = 5;
        function fn() {
            // b是函数fn里面声明的局部变量
            var b = 3;

            function f() {
                var b = 9;
                console.log(b);
            }
            f();
        }
        fn();




    </script>

</body>

</html>